package xyz.nanzhou.needDemo02.util;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @author: Nanzhou
 * @version: v0.0.2 (添加注释)
 * @date: 2023 2023/10/5 19:34
 */

/**
 * Ftp连接工具类
 * @author Nanzhou
 */
public class FtpUtil {

    private FTPClient ftpClient;

    /**
     * 通过 commons-net-3.6 进行操作
     */
    public FtpUtil() {
        ftpClient = new FTPClient();
    }

    /**
     * 连接 FTP
     * @param host 地址
     * @param port 端口
     * @param username 用户名
     * @param password 用户密码
     * @return 正常连接返回 true 反之，返回 false
     */
    public boolean connect(String host, int port, String username, String password) {
        try {
            ftpClient.connect(host, port);
            System.out.println("连接中...");

            //获取响应码
            int replyCode = ftpClient.getReplyCode();
            //是否正常连接
            if (!FTPReply.isPositiveCompletion(replyCode)) {
                ftpClient.disconnect();
                return false;
            }
            //是否正常登录
            if (!ftpClient.login(username, password)) {
                ftpClient.logout();
                return false;
            }

            System.out.println("连接成功");
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 上传文件
     * @param localFilePath 上传文件地址
     * @param remoteFilePath 上传目标地址
     * @return 成功上传返回 true 反之，返回 false
     */
    public boolean uploadFile(String localFilePath, String remoteFilePath) {
        try (FileInputStream fis = new FileInputStream(localFilePath)) {
            return ftpClient.storeFile(remoteFilePath, fis);
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 下载文件
     * @param remoteFilePath 下载目标文件地址
     * @param localFilePath 下载目标地址
     * @return 成功下载返回 true 反之，返回 false
     */
    public boolean downloadFile(String remoteFilePath, String localFilePath) {
        try (FileOutputStream fos = new FileOutputStream(localFilePath)) {
            return ftpClient.retrieveFile(remoteFilePath, fos);
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 断开连接
     */
    public void disconnect() {
        if (ftpClient.isConnected()) {
            try {
                //登出
                ftpClient.logout();
                //断开连接
                ftpClient.disconnect();
                System.out.println("断开连接");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}